from google.appengine.ext import db
from transaction.mopay.einstellungen import BEARBEITUNGSZEIT 
import string, random


from db_key import get_key_name
from const.models import Const

from statlib import stats # statistische funktionen, mean, stdev etc. sehr nuetzlich

def get_BEARBEITUNGSZEIT():
  c = Const.get_by_key_name('const')
  if c is None:
    return 120.0 # zwei Minuten
  else:
    return c.bearbeitungszeit

def get_bearbeitungszeit(bz,besucher_fitness=0.0):
  """ Liefert die Bearbeitungszeit in Sekunden an. Das ist der Countdown, der
      beim Benutzer erscheint. Die Bearbeitungszeit hat folgende Aufgaben:
        (1) Den Besucher in eine wettbewerbsorientierte Stimmung zu versetzen
        (2) Den Besucher laenger auf die Seite zu behalten
        (3) Dem Besucher ein positives Gefuehl zu vermitteln, falls er die Aufgabe
            richtig unter der gegebenen Zeit bearbeitet
      Dazu wird als Bearbeitungszeit folgende Zeit gegeben:
               Erwartungswert + 3*Standardabweichung (bezogen auf dei bearbeitungs_zeiten)
      3-Sigma-Intervall--> mind. 88,9% aller Besucher liegen dadrin.
      Falls bearbeitungs_zeiten = [], wird standardmaessig 300 Sek. zurueckgegeben.
      besucher_fitness = Anzahl der richtig geloesten Aufgaben / Anzahl der bearbeiteten Aufgaben (aus Besuchersicht)
  """
  if len(bz)>7:
    BZ = stats.lmean(bz)
    STDABW = stats.lstdev(bz)
  else:
    BZ = get_BEARBEITUNGSZEIT()
    STDABW = 0.2*BZ # todo: besser machen, --> wie Bearbeitungszeit: Daten runterladen STDABW berechnen --> als Const hochladen
 
  # 1-besucher_fitness  --> je besser ein Besucher ist, desto weniger Bearbeitungszeit hat er, aber immer noch genug
  return int(BZ+(3+5*(1-besucher_fitness)*random.random())*STDABW)


